home *** CD-ROM | disk | FTP | other *** search
/ Gold Medal Software 2 / Gold Medal Software Volume 2 (Gold Medal) (1994).iso / prog / tge129c.arj / SOURCE.ARJ / NEWMOUSE.ASM < prev    next >
Assembly Source File  |  1993-08-20  |  14KB  |  714 lines

  1. ; NEWMOUSE.ASM
  2. ; Copyright (c) 1993 by Matthew Hildebrand
  3. ; Turbo Assembler syntax
  4. ; This module may not be overlaid
  5.  
  6. ; Provides an interrupt-driven mouse driver extension by trapping the 33h
  7. ; interrupt and installing a mouse event handler.  The current position is
  8. ; monitored.  A user-definable external routine is used to draw the mouse
  9. ; pointer, which is a definable bitmap.
  10.  
  11.  
  12. IDEAL
  13. P486N        ; 286 code, but we want 486 alignment
  14. MODEL LARGE
  15. JUMPS
  16.  
  17. STRUC    buttonInfo
  18.   state        db    ?
  19.   pressX    dw    ?
  20.   pressY    dw    ?
  21.   pressCount    dw    ?
  22.   releaseX    dw    ?
  23.   releaseY    dw    ?
  24.   releaseCount    dw    ?
  25. ENDS
  26.  
  27.  
  28.     CODESEG
  29.  
  30.     LABEL    oldVect        DWORD
  31. old33Off    dw    ?
  32. old33Seg    dw    ?
  33.     LABEL    putPointer    DWORD
  34. putPointerOff    dw    ?
  35. putPointerSeg    dw    ?
  36.     LABEL    putBitmap    DWORD
  37. putBitmapOff    dw    ?
  38. putBitmapSeg    dw    ?
  39.     LABEL    getBitmap    DWORD
  40. getBitmapOff    dw    ?
  41. getBitmapSeg    dw    ?
  42.     LABEL    pointerAddr    DWORD
  43. pointerOff    dw    ?
  44. pointerSeg    dw    ?
  45.     LABEL    backgroundAddr    DWORD
  46. backgroundOff    dw    OFFSET background
  47. backgroundSeg    dw    SEG background
  48.  
  49. curx        dw    ?
  50. cury        dw    ?
  51. minx        dw    ?
  52. maxx        dw    ?
  53. miny        dw    ?
  54. maxy        dw    ?
  55. horizMickeys    dw    ?
  56. maxHorizMickeys    dw    ?
  57. vertMickeys    dw    ?
  58. maxVertMickeys    dw    ?
  59. xAdjMickeys    dw    ?
  60. yAdjMickeys    dw    ?
  61. pointerShown    dw    ?
  62. pointerWide    dw    ?
  63. pointerDeep    dw    ?
  64. xHotSpot    dw    ?
  65. yHotSpot    dw    ?
  66. oldx        dw    ?
  67. oldy        dw    ?
  68. oldButtonStatus    dw    ?
  69. buttonStatus    dw    ?
  70. leftButton    buttonInfo    ?
  71. rightButton    buttonInfo    ?
  72. centerButton    buttonInfo    ?
  73.  
  74. ; This array will store the contents of the screen behind the mouse pointer.
  75. ; If exceptionally large pointers will be used, increase the size of this
  76. ; buffer from 512 bytes to an appropriate value.  The default value should
  77. ; be sufficient for most applications.
  78. background    db    512    DUP(?)
  79.  
  80. busyFlag    dw    0
  81. active        dw    1
  82.  
  83.  
  84.     PUBLIC    C    TGE_initNewMouse
  85. PROC    C    TGE_initNewMouse
  86.     ARG    putPointerPtr:CODEPTR, putBitmapPtr:CODEPTR, getBitmapPtr:CODEPTR
  87.   push    ds
  88.  
  89.   xor    ax,ax                ; set up default values
  90.   mov    [minx],ax
  91.   mov    [maxx],319
  92.   mov    [miny],ax
  93.   mov    [maxy],199
  94.   mov    [curx],ax
  95.   mov    [cury],ax
  96.   mov    [xAdjMickeys],ax
  97.   mov    [yAdjMickeys],ax
  98.   mov    [pointerShown],ax
  99.   lds    bx,[putPointerPtr]
  100.   mov    [putPointerOff],bx
  101.   mov    [putPointerSeg],ds
  102.   lds    bx,[putBitmapPtr]
  103.   mov    [putBitmapOff],bx
  104.   mov    [putBitmapSeg],ds
  105.   lds    bx,[getBitmapPtr]
  106.   mov    [getBitmapOff],bx
  107.   mov    [getBitmapSeg],ds
  108.   mov    [oldx],ax
  109.   mov    [oldy],ax
  110.  
  111.   mov    ax,3                ; get button status
  112.   int    33h
  113.   mov    [buttonStatus],bx
  114.   mov    [oldButtonStatus],bx
  115.  
  116.   mov    ax,1Bh                    ; get sensitivity
  117.   int    33h
  118.   mov    ax,100
  119.   sub    ax,bx
  120.   shr    ax,3
  121.   inc    ax
  122.   mov    [horizMickeys],ax
  123.   mov    ax,100
  124.   sub    ax,cx
  125.   shr    ax,3
  126.   inc    ax
  127.   mov    [vertMickeys],ax
  128.   call    setMaxMickeys
  129.  
  130.   mov    ax,000Ch            ; set user-defined event handler
  131.   mov    cx,1111111b        ; mouse movement or button changed condition
  132.   mov    dx,SEG handler
  133.   mov    es,dx
  134.   mov    dx,OFFSET handler
  135.   int    33h
  136.  
  137.   mov    ax,0Bh                ; clear motion counters
  138.   int    33h
  139.  
  140.   mov    ax,3533h            ; get the old 33h vector
  141.   int    21h
  142.   mov    [old33Off],bx
  143.   mov    [old33Seg],es
  144.  
  145.   mov    ax,2533h            ; set the new 33h vector
  146.   mov    dx,SEG new33
  147.   mov    ds,dx
  148.   mov    dx,OFFSET new33
  149.   int    21h
  150.  
  151.   pop    ds
  152.   leave
  153.   retcode
  154. ENDP
  155.  
  156.     PUBLIC    C    TGE_deInitNewMouse
  157. PROC    C    TGE_deInitNewMouse
  158.   push    ds
  159.  
  160.   mov    ax,2533h            ; restore the old 33h vector
  161.   mov    ds,[old33Seg]
  162.   mov    dx,[old33Off]
  163.   int    21h
  164.  
  165.   mov    ax,000Ch            ; disable event handler
  166.   xor    cx,cx
  167.   int    33h
  168.  
  169.   pop    ds
  170.   retcode
  171. ENDP
  172.  
  173.     PUBLIC    C    TGE_disableNewMouse
  174. PROC    C    TGE_disableNewMouse
  175.   mov    ax,000Ch            ; disable event handler
  176.   xor    cx,cx
  177.   int    33h
  178.  
  179.   mov    [active],0
  180.   retcode
  181. ENDP
  182.  
  183.     PUBLIC    C    TGE_enableNewMouse
  184. PROC    C    TGE_enableNewMouse
  185.   mov    ax,000Ch            ; set user-defined event handler
  186.   mov    cx,1111111b        ; mouse movement or button changed condition
  187.   mov    dx,SEG handler
  188.   mov    es,dx
  189.   mov    dx,OFFSET handler
  190.   pushf
  191.   call    [oldVect]
  192.  
  193.   mov    ax,3
  194.   pushf
  195.   call    [oldVect]
  196.   mov    [buttonStatus],bx
  197.   mov    [oldButtonStatus],bx
  198.  
  199.   mov    [active],1
  200.   retcode
  201. ENDP
  202.  
  203.  
  204. PROC    new33    FAR
  205.   cmp    [active],1
  206.   jne    @@Exit
  207.  
  208.   cmp    ax,1                ; Show mouse pointer
  209.   je    showPointer
  210.  
  211.   cmp    ax,2                ; Hide mouse pointer
  212.   je    hidePointer
  213.  
  214.   cmp    ax,3                ; Get mouse position and button status
  215.   je    getPos
  216.  
  217.   cmp    ax,4                ; Set mouse pointer position
  218.   je    setPos
  219.  
  220.   cmp    ax,5                ; Get button press information
  221.   je    getPressInfo
  222.  
  223.   cmp    ax,6                ; Get button release information
  224.   je    getReleaseInfo
  225.  
  226.   cmp    ax,7                ; Set horizontal limits for pointer
  227.   je    setHorizLimits
  228.  
  229.   cmp    ax,8                ; Set vertical limits for pointer
  230.   je    setVertLimits
  231.  
  232.   cmp    ax,9                ; Set graphics pointer shape
  233.   je    setPointerShape
  234.  
  235.   cmp    ax,0Fh                ; Set mickeys to pixels ratio
  236.   je    setRatio
  237.  
  238.   cmp    ax,1Ah                ; Set mouse sensitivity
  239.   je    setSensitivity
  240.  
  241.   cmp    ax,1Bh                ; Get mouse sensitivity
  242.   je    getSensitivity
  243.  
  244.       @@Exit:
  245.   pushf
  246.   call    [cs:oldVect]            ; transfer to the old 33h handler
  247.   iret
  248. ENDP
  249.  
  250. PROC    showPointer    FAR
  251.   mov    [busyFlag],1
  252.   inc    [pointerShown]
  253.   cmp    [pointerShown],1
  254.   jne    @@Exit
  255.   call    drawPointer
  256.  
  257.     @@Exit:
  258.   mov    [busyFlag],0
  259.   iret
  260. ENDP
  261.  
  262. PROC    hidePointer    FAR
  263.   mov    [busyFlag],1
  264.   dec    [pointerShown]
  265.   cmp    [pointerShown],0
  266.   jne    @@Exit
  267.   call    killPointer
  268.  
  269.       @@Exit:
  270.   mov    [busyFlag],0
  271.   iret
  272. ENDP
  273.  
  274. PROC    getPos    FAR
  275.   mov    bx,[buttonStatus]
  276.   mov    cx,[curx]
  277.   mov    dx,[cury]
  278.   iret
  279. ENDP
  280.  
  281. PROC    setPos    FAR
  282.   cmp    [pointerShown],0
  283.   jle    @@setPosition
  284.   push    cx dx
  285.   call    killPointer
  286.   pop    dx cx
  287.  
  288.       @@setPosition:
  289.   mov    [curx],cx            ; store coordinates
  290.   mov    [cury],dx
  291.   call    ensureInBounds
  292.   mov    ax,[curx]            ; store new mickey counts
  293.   xor    dx,dx
  294.   mul    [horizMickeys]
  295.   mov    [xAdjMickeys],ax
  296.   mov    ax,[cury]
  297.   xor    dx,dx
  298.   mul    [vertMickeys]
  299.   mov    [yAdjMickeys],ax
  300.  
  301.   cmp    [pointerShown],0
  302.   jle    @@Exit
  303.   call    drawPointer
  304.  
  305.       @@Exit:
  306.   iret
  307. ENDP
  308.  
  309. PROC    getPressInfo    FAR
  310.   test    bx,000b
  311.   je    @@left
  312.   test    bx,010b
  313.   je    @@right
  314.   test    bx,100b
  315.   je    @@center
  316.   iret
  317.  
  318.   mov    ax,[buttonStatus]
  319.  
  320.     @@left:
  321.   mov   bx,[leftButton.pressCount]
  322.   mov    [leftButton.pressCount],0
  323.   mov    cx,[leftButton.pressX]
  324.   mov    dx,[leftButton.pressY]
  325.   iret
  326.  
  327.       @@right:
  328.   mov   bx,[rightButton.pressCount]
  329.   mov    [rightButton.pressCount],0
  330.   mov    cx,[rightButton.pressX]
  331.   mov    dx,[rightButton.pressY]
  332.   iret
  333.  
  334.         @@center:
  335.   mov   bx,[centerButton.pressCount]
  336.   mov    [centerButton.pressCount],0
  337.   mov    cx,[centerButton.pressX]
  338.   mov    dx,[centerButton.pressY]
  339.   iret
  340. ENDP
  341.  
  342. PROC    getReleaseInfo    FAR
  343.   test    bx,000b
  344.   je    @@left
  345.   test    bx,010b
  346.   je    @@right
  347.   test    bx,100b
  348.   je    @@center
  349.   iret
  350.  
  351.   mov    ax,[buttonStatus]
  352.  
  353.     @@left:
  354.   mov   bx,[leftButton.releaseCount]
  355.   mov    [leftButton.releaseCount],0
  356.   mov    cx,[leftButton.releaseX]
  357.   mov    dx,[leftButton.releaseY]
  358.   iret
  359.  
  360.       @@right:
  361.   mov   bx,[rightButton.releaseCount]
  362.   mov    [rightButton.releaseCount],0
  363.   mov    cx,[rightButton.releaseX]
  364.   mov    dx,[rightButton.releaseY]
  365.   iret
  366.  
  367.         @@center:
  368.   mov   bx,[centerButton.releaseCount]
  369.   mov    [centerButton.releaseCount],0
  370.   mov    cx,[centerButton.releaseX]
  371.   mov    dx,[centerButton.releaseY]
  372.   iret
  373. ENDP
  374.  
  375. PROC    setHorizLimits    FAR
  376.   mov    [minx],cx
  377.   mov    [maxx],dx
  378.   call    setMaxMickeys
  379.   call    ensureInBounds
  380.   iret
  381. ENDP
  382.  
  383. PROC    setVertLimits    FAR
  384.   mov    [miny],cx
  385.   mov    [maxy],dx
  386.   call    setMaxMickeys
  387.   call    ensureInBounds
  388.   iret
  389. ENDP
  390.  
  391. PROC    setPointerShape    FAR
  392.   push    ax bx cx dx             ; preserve registers
  393.  
  394.   cmp    [pointerShown],0        ; erase pointer if it's on-screen
  395.   jle    @@setAddr
  396.   call    killPointer
  397.  
  398.       @@setAddr:
  399.   mov    [xHotSpot],bx              ; set up pointer information
  400.   mov    [yHotSpot],cx
  401.   mov    [pointerSeg],es
  402.   mov    [pointerOff],dx
  403.   mov    bx,dx
  404.   mov    ax,[es:bx]
  405.   mov    [pointerWide],ax
  406.   add    bx,2
  407.   mov    ax,[es:bx]
  408.   mov    [pointerDeep],ax
  409.  
  410.   cmp    [pointerShown],0        ; redraw pointer if necessary
  411.   jle    @@Exit
  412.   call    drawPointer
  413.  
  414.       @@Exit:
  415.   pop    dx cx bx ax            ; clean up and go home
  416.   iret
  417. ENDP
  418.  
  419. PROC    setRatio    FAR
  420.   shr    cx,3                ; CX = horizontal mickeys/8 pixels
  421.   or    cx,cx
  422.   jnz    @@ySensitivity
  423.   inc    cx
  424.  
  425.     @@ySensitivity:
  426.   shr    dx,3                ; DX = vertical mickeys/8 pixels
  427.   or    dx,dx
  428.   jnz    @@setVars
  429.   inc    dx
  430.  
  431.       @@setVars:
  432.   mov    [horizMickeys],cx
  433.   mov    [vertMickeys],dx
  434.   call    setMaxMickeys
  435.   iret
  436. ENDP
  437.  
  438. PROC    setSensitivity    FAR
  439.   shr    bx,3                ; BX = horizontal mickeys/8 pixels
  440.   or    bx,bx
  441.   jnz    @@ySensitivity
  442.   inc    bx
  443.  
  444.     @@ySensitivity:
  445.   shr    cx,3                ; CX = vertical mickeys/8 pixels
  446.   or    cx,cx
  447.   jnz    @@setVars
  448.   inc    cx
  449.  
  450.       @@setVars:
  451.   mov    [horizMickeys],bx
  452.   mov    [vertMickeys],cx
  453.   call    setMaxMickeys
  454.   iret
  455. ENDP
  456.  
  457. PROC    getSensitivity    FAR
  458.   mov    bx,[horizMickeys]
  459.   shl    bx,3
  460.   mov    cx,[vertMickeys]
  461.   shl    cx,3
  462.   xor    dx,dx
  463.   iret
  464. ENDP
  465.  
  466. PROC    drawPointer    NEAR
  467.   mov    ax,[curx]            ; get what'll be behind pointer
  468.   sub    ax,[xHotSpot]
  469.   or    ax,ax                ; ensure >= 0
  470.   jns    @@L1
  471.   xor    ax,ax
  472.  
  473.       @@L1:
  474.   mov    cx,ax
  475.   add    cx,[pointerWide]
  476.  
  477.   mov    bx,[cury]
  478.   sub    bx,[yHotSpot]
  479.   or    bx,bx                ; ensure >= 0
  480.   jns    @@L2
  481.   xor    bx,bx
  482.  
  483.       @@L2:
  484.   mov    dx,bx
  485.   add    dx,[pointerDeep]
  486.  
  487.   call    [getBitmap] C, ax, bx, cx, dx, [backgroundAddr]    ; get background
  488.  
  489.   mov    ax,[curx]
  490.   sub    ax,[xHotSpot]
  491.   mov    bx,[cury]
  492.   sub    bx,[yHotSpot]
  493.   call    [putPointer] C, ax, bx, [pointerAddr]    ; draw pointer
  494.  
  495.       @@Exit:
  496.   ret
  497. ENDP
  498.  
  499. PROC    killPointer    NEAR
  500.   mov    ax,[curx]
  501.   sub    ax,[xHotSpot]
  502.   or    ax,ax
  503.   jns    @@L1
  504.   xor    ax,ax
  505.       @@L1:
  506.   mov    bx,[cury]
  507.   sub    bx,[yHotSpot]
  508.   or    bx,bx
  509.   jns    @@L2
  510.   xor    bx,bx
  511.       @@L2:
  512.   call    [putBitmap] C, ax, bx, [backgroundAddr]   ; restore background
  513.  
  514.       @@Exit:
  515.   ret
  516. ENDP
  517.  
  518. ; On entrance to handler:
  519. ; AX = mouse event flags (1111111b)
  520. ; BX = button state
  521. ; CX = X coordinate
  522. ; DX = Y coordinate
  523. ; SI = last raw horizontal mickey count
  524. ; DI = last raw vertical mickey count
  525. ; DS = mouse driver data segment
  526. PROC    handler    FAR
  527.   mov    ax,[buttonStatus]        ; has button status changed?
  528.   cmp    ax,bx
  529.   jne    @@Button            ; yes, button change
  530.  
  531.   cmp    [busyFlag],1            ; is NEWMOUSE busy?
  532.   je    @@Exit                ; yes, exit
  533.   mov    [busyFlag],1            ; set busy flag to true
  534.  
  535.   cmp    [pointerShown],0        ; kill pointer if necessary
  536.   jle    @@proceed
  537.   call    killPointer
  538.  
  539.       @@proceed:
  540.   mov    ax,0Bh                ; read mouse motion counters
  541.   pushf
  542.   call    [oldVect]
  543.   mov    bx,[xAdjMickeys]
  544.   add    bx,cx
  545.  
  546.   or    bx,bx
  547.   jns    @@notOffLeft            ; not off left edge
  548.   mov    [xAdjMickeys],0
  549.   jmp    short    @@checkVert
  550.       @@notOffLeft:
  551.   cmp    bx,[maxHorizMickeys]
  552.   jle    @@notOffRight            ; not off right edge
  553.   mov    bx,[maxHorizMickeys]
  554.   mov    [xAdjMickeys],bx
  555.   jmp    short    @@checkVert
  556.       @@notOffRight:
  557.   mov    [xAdjMickeys],bx
  558.  
  559.       @@checkVert:
  560.   mov    bx,[yAdjMickeys]
  561.   add    bx,dx                ; DX = delta y from before
  562.  
  563.   or    bx,bx
  564.   jns    @@notOffTop            ; not off left edge
  565.   mov    [yAdjMickeys],0
  566.   jmp    short    @@findCoords
  567.       @@notOffTop:
  568.   cmp    bx,[maxVertMickeys]
  569.   jle    @@notOffBottom            ; not off right edge
  570.   mov    bx,[maxVertMickeys]
  571.   mov    [yAdjMickeys],bx
  572.   jmp    short    @@findCoords
  573.       @@notOffBottom:
  574.   mov    [yAdjMickeys],bx
  575.  
  576.       @@findCoords:
  577.   xor    dx,dx                ; calculate x coordinate
  578.   mov    ax,[xAdjMickeys]
  579.   div    [horizMickeys]
  580.   mov    [curx],ax
  581.  
  582.   xor    dx,dx                ; calculate y coordinate
  583.   mov    ax,[yAdjMickeys]
  584.   div    [vertMickeys]
  585.   mov    [cury],ax
  586.  
  587.   cmp    [pointerShown],0
  588.   jle    @@Exit
  589.   call    drawPointer
  590.  
  591.       @@Exit:
  592.   mov    [busyFlag],0            ; set busy flag to false
  593.   retf
  594.  
  595.  
  596.       @@Button:
  597.   mov    [buttonStatus],bx
  598.   and    bx,[oldButtonStatus]        ; find changed button
  599.   xor    bx,001b
  600.   jnz    @@left                ; left button
  601.   and    bx,110b
  602.   xor    bx,010b
  603.   jnz    @@right                ; right button
  604.   and    bx,011b
  605.   xor    bx,100b
  606.   jnz    @@center            ; center button
  607.   retf
  608.  
  609.     @@left:
  610.   mov    bx,[buttonStatus]
  611.   and    bx,1
  612.   je    @@leftPress
  613.   inc    [leftButton.releaseCount]
  614.   mov    ax,[curx]
  615.   mov    [leftButton.releaseX],ax
  616.   mov    ax,[cury]
  617.   mov    [leftButton.releaseY],ax
  618.   mov    [leftButton.state],0
  619.       @@leftPress:
  620.   inc    [leftButton.pressCount]
  621.   mov    ax,[curx]
  622.   mov    [leftButton.pressX],ax
  623.   mov    ax,[cury]
  624.   mov    [leftButton.pressY],ax
  625.   mov    [leftButton.state],1
  626.   retf
  627.  
  628.       @@right:
  629.   mov    bx,[buttonStatus]
  630.   and    bx,1
  631.   je    @@rightPress
  632.   inc    [rightButton.releaseCount]
  633.   mov    ax,[curx]
  634.   mov    [rightButton.releaseX],ax
  635.   mov    ax,[cury]
  636.   mov    [rightButton.releaseY],ax
  637.   mov    [rightButton.state],0
  638.       @@rightPress:
  639.   inc    [rightButton.pressCount]
  640.   mov    ax,[curx]
  641.   mov    [rightButton.pressX],ax
  642.   mov    ax,[cury]
  643.   mov    [rightButton.pressY],ax
  644.   mov    [rightButton.state],1
  645.   retf
  646.  
  647.       @@center:
  648.   mov    bx,[buttonStatus]
  649.   and    bx,1
  650.   je    @@centerPress
  651.   inc    [centerButton.releaseCount]
  652.   mov    ax,[curx]
  653.   mov    [centerButton.releaseX],ax
  654.   mov    ax,[cury]
  655.   mov    [centerButton.releaseY],ax
  656.   mov    [centerButton.state],0
  657.       @@centerPress:
  658.   inc    [centerButton.pressCount]
  659.   mov    ax,[curx]
  660.   mov    [centerButton.pressX],ax
  661.   mov    ax,[cury]
  662.   mov    [centerButton.pressY],ax
  663.   mov    [centerButton.state],1
  664.   retf
  665. ENDP
  666.  
  667. ; Destroys AX
  668. PROC    ensureInBounds    NEAR
  669.   mov    ax,[curx]            ; x coordinate
  670.   cmp    ax,[minx]
  671.   jge    @@L1
  672.   mov    ax,[minx]
  673.   mov    [curx],ax
  674.   jmp    short    @@L2
  675.     @@L1:
  676.   cmp    ax,[maxx]
  677.   jle    @@L2
  678.   mov    ax,[maxx]
  679.   mov    [curx],ax
  680.  
  681.     @@L2:                ; y coordinate
  682.   mov    ax,[cury]
  683.   cmp    ax,[miny]
  684.   jge    @@L3
  685.   mov    ax,[miny]
  686.   mov    [cury],ax
  687.   jmp    short    @@L4
  688.     @@L3:
  689.   cmp    ax,[maxy]
  690.   jle    @@L4
  691.   mov    ax,[maxy]
  692.   mov    [cury],ax
  693.  
  694.       @@L4:
  695.   ret
  696. ENDP
  697.  
  698. ; Destroys AX and DX
  699. PROC    setMaxMickeys    NEAR
  700.   mov    ax,[maxx]
  701.   mov    dx,[horizMickeys]
  702.   mul    dx
  703.   mov    [maxHorizMickeys],ax
  704.  
  705.   mov    ax,[maxy]
  706.   mov    dx,[vertMickeys]
  707.   mul    dx
  708.   mov    [maxVertMickeys],ax
  709.  
  710.   ret
  711. ENDP
  712.  
  713.     ENDS
  714. END